package com.mtoolkit.socket.server;

import java.nio.channels.SelectionKey;
import java.nio.channels.SocketChannel;
import java.util.LinkedList;
import java.util.List;

import com.mtoolkit.socket.SocketRequest;
import com.mtoolkit.socket.SocketResponse;

/**
 * 写线程。
 * 和读操作一样，使用线程池，负责将服务器端的数据发送回客户端。 
 */
class NioServerWriter extends Thread {
	private static List<SelectionKey> pool = new LinkedList<SelectionKey>();
    private static NioServerEventNotifier notifier = NioServerEventNotifier.getNotifier();

    public NioServerWriter() {
    }

    @Override
    public void run() {
        while (true) {
            SelectionKey key;
            try {
                synchronized (pool) {
                    while (pool.isEmpty()) {
                        pool.wait();
                    }
                    key = pool.remove(0);
                }

                // 处理写事件
                write(key);
            } catch (InterruptedException ex) {
                continue;
            }
        }
    }

    /**
     * 向客户端发送数据。
     * @param key 选择键。
     */
    private void write(SelectionKey key) {
        SocketChannel socketChannel = (SocketChannel) key.channel();
        SocketResponse response = null;
        		//new SocketResponse(socketChannel);
        try {
            // 触发onWrite事件
            notifier.fireOnWrite((SocketRequest) key.attachment(), response);

            // 关闭
//            socketChannel.finishConnect();
//            socketChannel.socket().close();
//            socketChannel.close();

            // 触发onClosed事件
            notifier.fireOnClosed((SocketRequest) key.attachment());
        } catch (Exception ex) {
            notifier.fireOnError(ex);
        }
    }

    /**
     * 处理客户请求，管理用户的联结池，并唤醒队列中的线程进行处理。
     * @param key 选择键。
     */
    public static void processRequest(SelectionKey key) {
        synchronized (pool) {
            pool.add(pool.size(), key);
            pool.notifyAll();
        }
    }
}
